Это баг варика. Когда ты используешь несколько диалогов и показываешь их подряд, название Title надо каждый раз заново создавать. Если бы у тебя был один диалог и ты бы его показывал несколько раз подряд - заголовок сохраниться.
Могу посоветовать при пересоздании запускать триггер dialog повторно.
Постоянный харас хумана. Для начала проверить, есть ли у него экспанд. Если он собирается его основать - пытаться всячески сносить. Пытаться мешать крипингу (создавать скелетов жезлом, убивать побитых пехотинцев, ополчение коилом). Если хуману все же удалось построить экспанд, необходимо переходить в постоянную осаду, которая поддерживается с помощью пауков. Быстрый подъем до Т2 (Чертоги мертвых), после чего строится бойня и Лич, как второй герой (ДК - первый герой, кстати). При осаде стараться убить как можно больше пехотинцев. От экспанда лучше не отступать, так как хуман должен нести постоянные потери. При возможности убивать героя (но не сильно акцентировать на нем внимание; коил + нова, если герой хумана додыхает). Постоянно поттягивать статуи к экспанду и перебираться та Т3 (Темная Цитадель), после чего провести улучшения для сфинксов. Так как хуманы любят башни, необходимо статуи превратить в сфинксов и вынести ему башни (причем нужно каждого превратить отдельно и из следующей статуи вытащить всю ману; делать поочередно, не торопясь). Сплеш от ударов сфинксов снесет всех рабочих, которые попытаются реанимировать башни. После такого для хуманов игра завершается поражением. Главное все сделать правильно и последовательно.
Про выключение ручных сейвов ничего не могу сказать, а второй пункт решается созданием кастомного меню выхода через диалог, где ты сохраняешь игру через код. Только продолжать надо будет всё равно через загрузку игры.
мультиборд в карте на ГУИ? в гуи функциях внутри часто необнуляются локальные переменные объектов
если код то мб не используется MultiboardReleaseItem и итемы остаются висеть
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
xgm.guru/p/wc3/articles Попробуй сделать что-нибудь сам. Посмотри, что вообще там можно сделать. Если ты просишь сделать за тебе двухстрочный триггер - забей.
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
действие проиграть звук и указываешь твою фразу
выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360.
real r2 = GetUnitFacing(uWhichBack) + 360.
if GetUnitY(uWhichBack) < GetUnitY(uF) then
set r1 = r1 + 360.
endif
return (r1<=(r2+45.) and r1>=(r2-45.))
endfunction
Юзать структуры, свои собственные системы хранения данных.
Если вы только решили слезть с гуи+ вейты на jass, то вам рано думать о таком.
Таймер + хештаблицы в помощь, в статьях есть много информации на эту тему.
Что вам еще непонятно? ImbaStyle, что есть TriggerSleepActions и timer вам известно?
Нельзя просто использовать таймер вместо вейта посередине триггера (гуишный вейт именно так и работает - запускает таймер и проверяет циклом каждые 0.1 сек пока он не пройдет).
Но если так уж нужно узнать истек ли таймер:
Real comparison - Обратный отсчет - Remaining time for timer (оставшееся время таймера)
Уже давно забыл что такое варкрафт и как выглядят тригерры но попробую объяснить по кривому)
Через событие юнит атакован выставляй шанс на то что даммик бафнет героя дамми бафом который даёт лайф стил и атак спид...
Как-то так)
Более подробно и правильно объяснить не смогу т.к ничерта не помню)
Неуязвимость проверяют через даммика с атакой, через приказ, сможет ли атаковать или нет, просто проверка выполнения приказа. Так же пытаются нанести урон и смотрят сколько он отнял здоровья, так можно и определить неуязвимость и вычислить резист юнита к конкретному типу урона.
Так ведь в редакторе объектов есть строчка "Пути - требование к расположению". Там можно просто поставить галочку "Неиспорченный" и построить это здание на порченной земле будет уже нельзя.
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit s=GetEventDamageSource()
local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
local texttag tt=CreateTextTag()
local real dmg=GetEventDamage()
if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
if GetPlayerId(GetOwningPlayer(u))==12 then
call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
else
call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
endif
call SetTextTagPosUnit(tt, u, 0)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 1.0)
call SetTextTagFadepoint(tt, 0.0)
endif
call PolledWait(2.0)
call DestroyTextTag(tt)
set u=null
set s=null
set i=0
set dmg=0
set tt=null
endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function theSDMSTriggerActions takes nothing returns nothing
local trigger UnitEnter=CreateTrigger()
call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
set UnitEnter=null
endfunction
function InitTrig_the_SDMS_Trigger takes nothing returns nothing
local trigger tr=CreateTrigger()
set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
call TriggerRegisterTimerEventSingle(tr,0.0)
call TriggerAddAction(tr,function theSDMSTriggerActions)
set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
сделать базу даных по названию...
строка[1] = "пехотинец"
строка[2] = "паладин"
тип юнита[1] = пехотинец
тип юнита[2] = паладин
цыкл
если введенная строка == строка[А]
создать юнита тип юнита[А]
Это конкретно по ошибке... а вообще - не надо смотреть видео от этого человека, он тебя плохому научит... правда. А другим потом придётся тебя переучивать, если ты сам это дело не забросишь
Значит 3 раза понижали. Опыт может снятся только в одном из этих случаев:
ресурс снят с публикации который ранее был опубликован
проект снижен в уровне, который ранее был большего уровня
удален опубликованный комментарий / пост на форуме
ты написал сообщение в оффтопку на форуме (за каждый пост -1 опыта)
ну и самый редкий вариант ,если какой то модератор пользуюсь служебным положением заабузит админку и начислит н-ое кол-во опыта определенному юзера, мы это спалим и снимем опыт назад.
Значит 3 раза понижали. Опыт может снятся только в одном из этих случаев:
ресурс снят с публикации который ранее был опубликован
проект снижен в уровне, который ранее был большего уровня
удален опубликованный комментарий / пост на форуме
ты написал сообщение в оффтопку на форуме (за каждый пост -1 опыта)
ну и самый редкий вариант ,если какой то модератор пользуюсь служебным положением заабузит админку и начислит н-ое кол-во опыта определенному юзера, мы это спалим и снимем опыт назад.
Уровень = Уровню героя. Характеристики = Характеристикам героя. Цикл 6-разовый на каждый слот дающий предмет герою. Уровни способностей равные уровню способностей героя. Героя, в смысле твоего героя. Ну еще создать юнита типа твоего героя. Что-то еще? Если он где-то в переменных для пассивок, то с ними тоже по колдовать и все.
Будет только одна проблема, если ты книги атаки на его юзал то их никак не засеч без геморроя. А так все в виде целочисленных на твоем герое записано.
на сколько я понял проблема в том что после смерти способность не удаляется
тогда нужен триггер с событием юнит умирает
и если юнит герой то удалять эту способность Melissa:
Ну и если вдруг скилл используют одновременно или почти одновременно десятки юнитов - то не у всех панцирь будет корректно удаляться.
Ну хз, ручками удали скилл слк или тхт, хз как там у тебя, после деоптимизации карты (снятия защиты) часто бывают баги с обьектными данными, попробуйте другой деоптимизатор, или правьте ручками...
Делай call UnitMakeAbilityPermanent(u, true,'A000') ) .
Где вместо A000 твоя абилка.
Если абила спеллбучная, то все спеллбуки тоже надо вживлять.
Перманент-абилы не пропадают после морфа и анморфа. Просто добавленные - пропадают.
Ну что пацаны Datamanager ?
Дам подсказку, смотреть на систему ливов и сыгранный игр, там переменная сама инкрементируется за каждый запуск игры, и сама подгружается, но надо включить локальные файлы и сделать привязку к нику и зашифровать данные, ибо иначе тут всё в открытом виде, можно сбрасывать значение
Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
научись правильно выражать свои мысли
наработки тут не кидают (это раздел вопросы а наработки)
если я правильно понял то тебе надо сделать следующее:
составить список играющих игроков
каждые n секунд брать из этого списка 2 случайных игрока и тпшить их героев на арену
после смерти 1 из этих героев тпшить обоих на базу (т.к. проигравший мёртв то тпшнится только победитель)
теперь пройдёмся подробно по пунктам
массив игроков и переменная count типа целочисленная равная 0 изначально
перебираем всех игроков от 0 до 11
если игрок играет то заносим его в массив под индексом count
увеличиваем значение count на 1
триггер с событием/таймер каждые n секунд
в действиях берём случайное число от 0 до count
это индекс первого игрока на дуэли
потом снова случайное число от 0 до count
если оно совпадает с предыдущим числом то снова случайное число от 0 до count
и так до тех пор пока новое число не будет отличаться от первого (делается циклом)
потом используем полученные 2 числа как индексы к массиву игроков и тпшим их героев на арену
как только герой умирает проверяем является ли владелец умершего героя одним из выбранных игроков
потом тпшим обоих героев на базу и выдаём чтото наподобие "игрок выживший_игрок победил"
подробнее в статьях
В этом действии Отряд - Pick every unit in (Random 1 units from (Units in Game Area <gen> owned by Player_Hero[Random_Duel])) and do (Actions) где задаётся Random_Duel? Оно как было при инициализации задано, так и не меняется. То есть сначала выбираешь в общей области сражений юнита игрока и перемещаешь его в дуэльную область, а через 2 секунды опять пытаешься выбрать в общей области сражений юнита этого игрока, которого уже там нет, он в дуэльной. Это только то, что бросилось в глаза в самом триггере, в игре не проверял.
если ты используешь звук 1 раз то да, а если нет то заносим звук в глобальную переменную и проигрываем когда нужно.
В гуях вроде со звуками все было ровно, ничего изобретать ненужно...
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Спасибо всем, отбой, все нормально с позиционными звуками, у меня была включена кинематика и оказывается она игнорирует позиционные звуки... извините за беспокойство, на счет звука на точке не знаю, но на юните работает как надо.
"Набор звуков" нельзя сделать через триггеры, но можно попробовать через импорт файлов заменить стандартные файлы в уже существующих наборах.
Для этого импортируемому файлу надо прописать путь заменяемого.
Нельзя. Потому что даже в твоей сугубо триггерной карте, когда запускается команда на исполнение все конвертируется в jass/( Когда ты играешь или проверяешь карту)
Триггер . лишь графическая оболочка, как бы кубики на которых написаны буквы, но все-равно все происходит на jasse ( уже иногда на lua)
Короче нельзя. скачивай jngp и учи хотя бы простые джассовые команды.
Хотя даже зная его взломанная карта часто выкладывает огромный набор проограмного кода без разделения где конкретный текстовый триггер инициализации или определенного дейсвтия.
Нет. Кампании пока не рассчитаны на сетевую игру, переходы с карты на карту работать не будут. Преодолевать ограничение в количестве декораций можно было в редакторе JNGP, но он рассчитан на патч 1.26, а также может работать с 1.27, на новые патчи не знаю, что позволяет ставить больше декораций.
По идее и кэш в сетевой не будет работать, так как у одного игрока могут быть в кэше одни данные, а у другого другие. Но тут не проверял, а лишь предполагаю, так как специализируюсь на кампаниях, а не сетевых играх)
// blizzard.j:1772
function GetRectCenter takes rect whichRect returns location
return Location(GetRectCenterX(whichRect), GetRectCenterY(whichRect))
endfunction
а эвент регистрируется 1 раз, так что можно забить
// blizzard.j:7959
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
local region rectRegion = CreateRegion()
call RegionAddRect(rectRegion, r)
return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
Другое дело, что у order есть утечка, но это нативно, она минимальная и это никак не исправляется.
» WarCraft 3 / Помощь в начале.
» WarCraft 3 / Нужна помощь с триггером
» WarCraft 3 / Блок атаки
» WarCraft 3 / Работает ли GetItemTypeId
» WarCraft 3 / Таймер вместо вейта
» WarCraft 3 / Контратака
» WarCraft 3 / Отлов точки приказа постройки
» WarCraft 3 / Строка и переменная тип юнита
» WarCraft 3 / Команда для игрока
» WarCraft 3 / Редактирование текстур
» Администрация XGM / как получить уровень 1
» Администрация XGM / как получить мне уровень в этом сайте
» WarCraft 3 / Собственные характеристики для героя
» WarCraft 3 / Не удаляется способность
» WarCraft 3 / Помогите разобраться с опытом
» WarCraft 3 / Утекает ли область?
» WarCraft 3 / Мульти атака одного юнита.
» WarCraft 3 / Как отловить юнита, который наносит урон?
» WarCraft 3 / Дуэль
» WarCraft 3 / Проигрывание звука
» WarCraft 3 / Lua или jass?
» WarCraft 3 / Как сделать кастомную озвучку
» WarCraft 3 / Кампания
» WarCraft 3 / Помогите найти утечку